package czStvDpds.mapmanagment;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

/**
 * Tato třída obsahuje pouze jednu statickou metodu, která nahraje mapu ze
 * zadaného souboru podle zadané cesty (např. "resources/maps/map.txt")
 *
 * @author Jirka
 */
public class MapLoader {

    /**
     * Přečte a vrátí mapu ze zadaného textového souboru podle zadané cesty,
     * např. "resources/maps/map.txt". Řádky v textovém souboru začínající
     * znakem '#' jsou komentáře, tj. nenahrávají se.
     *
     * @see Map
     *
     * @param fileName
     * @return
     * @throws IOException
     */
    public static Map loadMap(String fileName) throws IOException {
        ArrayList<String> lines = new ArrayList<>();
        int width = 0;
        int height = 0;

        // Načíst řádky v textovém souboru
        BufferedReader reader = new BufferedReader(new FileReader(fileName));

        while (true) {
            String line = reader.readLine();
            // Když nejsou řádky k načtení
            if (line == null) {
                reader.close();
                break;
            }

            // Načíst všechny řádky kromě komentářů
            if (!line.startsWith("#")) {
                lines.add(line);
                width = Math.max(width, line.length());
            }
        }

        // Analyzovat řádky a vytvořit objekt Map
        height = lines.size();
        Map newMap = new Map(width, height);

        for (int y = 0; y < height; y++) {
            String line = lines.get(y);
            for (int x = 0; x < line.length(); x++) {
                char ch = line.charAt(x);

                if (Character.getNumericValue(ch) >= 1 && Character.getNumericValue(ch) <= 9) {
                    newMap.setTile(x, y, TilesInfo.getTilesInfo().getTile(Character.getNumericValue(ch)));
                } else {
                    if (ch == 's') {
                        newMap.setTile(x, y, TilesInfo.getTilesInfo().getTile(10)); // provizorní druh řešení rozpoznání
                    }
                }
            }
        }

        return newMap;
    }
}
